package org.dandsoft.blackbox.mapreduce.processor;

import org.dandsoft.blackbox.mapreduce.client.operation.Operation;

import java.util.Map;

/**
 * Интерфейс процессора. Процессор производит выполнение операции.
 *
 * @author Vilyuzhanin Denis (Fin)
 */
public interface OperationProcessor {

    void input(Map data);


    Map output();

    /**
     * Установить класс операции
     *
     * @param operationClass
     */
    void setOperationClass(Class<? extends Operation> operationClass);

    /**
     * Получить класс операции.
     *
     * @return
     */
    Class<? extends Operation> getOperationClass();

    void setOperation(Operation operation);

    Operation getOperation();

    /**
     * Установить свойства операции, эти свойства могут быть получены через контекст.
     *
     * @param properties
     */
    void setProperties(Map<String, String> properties);

    /**
     * Получить свойства операции
     *
     * @return
     */
    Map<String, String> getProperties();

    /**
     * Запустить выполнение операции.
     *
     * @throws ProcessorException
     */
    void execute() throws ProcessorException;

    /**
     * Добавить слушателя
     *
     * @param listener
     */
    void addListener(OperationProcessorListener listener);

    /**
     * Удалить слушателя
     *
     * @param listener
     */
    void removeListener(OperationProcessorListener listener);

    void reset();
}
